/*
 * Template criado em 03/09/2008
 * 
 * Autores: Igor Benício de Mesquita
 *          
 */
package br.uniceub.fsw.template.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.template.vo.TemplateVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade Template. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.
 * 
 * @author Aluno RA
 */
public class TemplateDAO extends BaseDAO<TemplateVO> {

    @Override
    public void inserir(TemplateVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_TEMPLATE(NO_TEMPLATE, DT_TEMPLATE, CD_TEMPLATE)");
        query.append("VALUES (?, ?, ?)");

        List<?> parametros = criarParametros(entidade.getNoTemplate(),
                entidade.getDtTemplate(), entidade.getCdTemplate());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        entidade.setIdTemplate(idGerado);
    }

    @Override
    public void alterar(TemplateVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_TEMPLATE SET NO_TEMPLATE = ?,");
        query.append("DT_TEMPLATE = ?,");
        query.append("CD_TEMPLATE = ?");
        query.append("WHERE ID_TEMPLATE = ?");

        List<?> parametros = criarParametros(entidade.getNoTemplate(), entidade.getDtTemplate(),
                entidade.getCdTemplate(), entidade.getIdTemplate());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(TemplateVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_TEMPLATE");
        query.append("WHERE ID_TEMPLATE = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdTemplate()));
    }

    @Override
    public TemplateVO consultarPorId(Serializable id) {

        TemplateVO template = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_TEMPLATE T WHERE T.ID_TEMPLATE = ?");

        template = consultarUm(query.toString(), criarParametros(id));

        return template;
    }

    @Override
    public List<TemplateVO> consultarPorExemplo(TemplateVO exemplo) {

        List<TemplateVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_TEMPLATE T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    @Override
    protected TemplateVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        TemplateVO template = new TemplateVO();
        
        template.setIdTemplate(rs.getInt("ID_TEMPLATE"));
        template.setDtTemplate(rs.getDate("DT_TEMPLATE"));
        template.setNoTemplate(rs.getString("NO_TEMPLATE"));
        template.setCdTemplate(new Integer(rs.getInt("CD_TEMPLATE")));

        return template;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, TemplateVO exemplo) {

        if (exemplo.getNoTemplate() != null && !exemplo.getNoTemplate().isEmpty()) {
            query.append("AND T.NO_TEMPLATE LIKE ?");
            adicionarParametro("%" + exemplo.getNoTemplate() + "%");
        }

        if (exemplo.getDtTemplate() != null) {
            query.append("AND T.DT_TEMPLATE = ?");
            adicionarParametro(exemplo.getDtTemplate());
        }

        if (exemplo.getCdTemplate() != null) {
            query.append("AND T.CD_TEMPLATE = ?");
            adicionarParametro(exemplo.getCdTemplate());
        }
    }
}
